#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> Result;
vector<int> tmp;

// 从1-n中任取r个数的所有组合
// m为当前迭代次数，d为当前选取数值
// A为某一个组合
void Combination(int n, int r, vector<int> &A, int m, int d)
{
  if (d > n + 1) // 因为先加入n，再递归n+1，所以这里不能写成d>n
    return;

  if (m == r)
    Result.push_back(A);
  else
  {
    A.push_back(d); // 如果要当前数
    Combination(n, r, A, ++m, d + 1);
    A.pop_back(); // 如果不要当前数
    Combination(n, r, A, --m, d + 1);
  }
}

int main()
{
  Combination(5, 3, tmp, 0, 1);
  for (auto vec : Result)
  {
    for (int val : vec)
      cout << val << " ";
    cout << endl;
  }

  return 0;
}

/*
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4
2 3 5
2 4 5
3 4 5
*/